在程式中可以使用traceback 或try ... exception 的方式去做各種例外事件的攔截,但在通訊中該怎麼做呢? 筆者這次在USB轉串列埠的裝置應用中屢屢吃瘪,真的不知道原來通訊中的瘪還可以這樣吃到怕,那該如何逆襲這種情況呢?
總不能每次都吃瘪當吃補吧,這次就來介紹如何可以做到快樂捉鱉而不吃鱉的通訊界神器的應用。
PART 1 - 捉鱉前, 當然要先準備捉鱉用的各種道具
- 下載USB Viewer 軟體以觀察每個USB的動向
- 解壓縮後會看下面三個檔案, 直接執行第一個就行了
- 執行後就可以看到電腦中每個USB Port的即時狀態
PS: USBViewer 這個好用的工具, 以往都是被放在Windows SDK/ DDK 中
- 下載Wireshark 任意版本直接安裝
- 安裝的時候要選取USBPcap才能讓Wireshark 擷取到USB的訊號
- 安裝結束後, 一定要重開機
- 重開機後打開Wireshark, 看到USB 出現了
PART II: 找看看鱉在哪裡?
這次要擷取的是SilCon CP210x USB to Serial 的訊號及分析
-
打開Wireshark後, 直接選擇USB Pcap2, 點選左上角的錄製
- 可以在Device Description 中對照相關的訊息後確定要擷取的是這個Port 沒有錯
- 在USB View 中看到的是這次要觀察的對象在Port 2
-
對這個Serial 裝置下01030C00, 16進位的數據, 觀察封包行為
- 輸入指令後, 可以觀察到Host 對裝置發出BULK OUT的串流
- 檢查內容, 發現是BLE Reset 的HEX 值
- 觀察Device 回應的狀態, 查看BULK IN的資料流
- 資料回傳後會再送一個0xff的空值, 代表結束
結論
由於筆者送出資料的時候都沒有加0xff, 所以資料並沒有被成功發送出去。而導致每次都要重新插拔裝置後才能使用. 導致問題發生的原因就是串列埠的timeout時間設定過長,所以才會導致裝置無法回應。但如果是使用猜測或只有在程式中除錯的方式,那就只能把吃瘪當吃補了。
參考資料
USB 數據包分析